﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace Zeus.Extension.MyFile
{
    public class FileUtil
    {
        public static string ReadFile(string filePath)
        {
            StreamReader sr = new StreamReader(filePath);
            string line;
            string content = "";

            while ((line = sr.ReadLine()) != null)
            {
                content += line;
            }

            return content;
        }

        public static string ReadFileChn(string filePath)
        {
            StreamReader sr = new StreamReader(filePath, UnicodeEncoding.GetEncoding("GB2312"));
            string line;
            string content = "";

            while ((line = sr.ReadLine()) != null)
            {
                content += line;
            }

            return content;
        }

        public static bool WriteFile(string filePath, string content)
        {
            try
            {
                FileStream fs = new FileStream(filePath, FileMode.Create);
                //实例化一个StreamWriter-->与fs相关联
                StreamWriter sw = new StreamWriter(fs);
                //开始写入
                sw.Write(content);
                //清空缓冲区
                sw.Flush();
                //关闭流
                sw.Close();
                fs.Close();

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        //获取当前应用程序所在路径
        public static string GetCurrentAppPath()
        {
            string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string appPath = Directory.GetParent(baseDir).ToString();

            appPath = Directory.GetParent(appPath).ToString();

            return appPath;
        }

        //创建或增加日志
        public static void AppendLog(string filePath, string logString)
        {
            //如果文件不存在则创建该文件
            if (!File.Exists(filePath))
            {
                //创建一个FileInfo对象
                FileInfo file = new FileInfo(filePath);

                //创建文件
                FileStream fs = file.Create();

                //关闭文件流
                fs.Close();

            }

            File.AppendAllText(filePath, logString);
        }


        #region 检测指定目录是否存在
        /// <summary>
        /// 检测指定目录是否存在
        /// </summary>
        /// <param name="directoryPath">目录的绝对路径</param>
        /// <returns></returns>
        public static bool IsExistDirectory(string directoryPath)
        {
            return Directory.Exists(directoryPath);
        }
        #endregion

        #region 检测指定文件是否存在,如果存在返回true
        /// <summary>
        /// 检测指定文件是否存在,如果存在则返回true。
        /// </summary>
        /// <param name="filePath">文件的绝对路径</param>        
        public static bool IsExistFile(string filePath)
        {
            return File.Exists(filePath);
        }
        #endregion

        #region 获取指定目录中的文件列表
        /// <summary>
        /// 获取指定目录中所有文件列表
        /// </summary>
        /// <param name="directoryPath">指定目录的绝对路径</param>        
        public static string[] GetFileNames(string directoryPath)
        {
            //如果目录不存在，则抛出异常
            if (!IsExistDirectory(directoryPath))
            {
                throw new FileNotFoundException();
            }

            //获取文件列表
            return Directory.GetFiles(directoryPath);
        }
        #endregion

        #region 创建一个目录
        /// <summary>
        /// 创建一个目录
        /// </summary>
        /// <param name="directoryPath">目录的绝对路径</param>
        public static void CreateDirectory(string directoryPath)
        {
            //如果目录不存在则创建该目录
            if (!IsExistDirectory(directoryPath))
            {
                Directory.CreateDirectory(directoryPath);
            }
        }
        #endregion

        #region 将文件移动到指定目录
        /// <summary>
        /// 将文件移动到指定目录
        /// </summary>
        /// <param name="sourceFilePath">需要移动的源文件的绝对路径</param>
        /// <param name="descDirectoryPath">移动到的目录的绝对路径</param>
        /*
        public static void Move(string sourceFilePath, string descDirectoryPath)
        {
            //获取源文件的名称
            string sourceFileName = GetFileName(sourceFilePath);

            if (IsExistDirectory(descDirectoryPath))
            {
                //如果目标中存在同名文件,则删除
                if (IsExistFile(descDirectoryPath + "\\" + sourceFileName))
                {
                    DeleteFile(descDirectoryPath + "\\" + sourceFileName);
                }
                //将文件移动到指定目录
                File.Move(sourceFilePath, descDirectoryPath + "\\" + sourceFileName);
            }
        }
        */
        #endregion

        #region 从文件的绝对路径中获取文件名( 包含扩展名 )
        /// <summary>
        /// 从文件的绝对路径中获取文件名( 包含扩展名 )
        /// </summary>
        /// <param name="filePath">文件的绝对路径</param>        
        public static string GetFileName(string filePath)
        {
            //获取文件的名称
            FileInfo fi = new FileInfo(filePath);
            return fi.Name;
        }
        #endregion

        #region 删除文件
        /// <summary>
        /// 删除文件
        /// </summary>
        /// <param name="file">要删除的文件路径和名称</param>
        /*
        public static void DeleteFile(string file)
        {
            if (File.Exists(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + file))
                File.Delete(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + file);
        }
        */
        #endregion

        #region 创建或追加写入
        /// <summary>
        /// 创建或追加写入
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="logString"></param>
        public static void CreateAndAppendFile(string filePath, string logString)
        {
            try
            {
                //如果路径不存在,则创建改路径
                CreateDirectory(Path.GetDirectoryName(filePath));
                //如果文件不存在则创建该文件
                if (!IsExistFile(filePath))
                {
                    //创建一个FileInfo对象
                    FileInfo file = new FileInfo(filePath);

                    //创建文件
                    FileStream fs = file.Create();

                    //关闭文件流
                    fs.Close();

                }
                File.AppendAllText(filePath, logString);
            }
            catch
            {
                //LogHelper.WriteTraceLog(TraceLogLevel.Error, ex.Message);
                //throw ex;
            }
        }
        #endregion
    }
}
